home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 2 of 2).iso / cheats / lvlinfo / lvlinfo.txt < prev    next >
Text File  |  1995-03-16  |  12KB  |  303 lines

  1. Descent Level and Mission Format 0.10 <-- Note the version number!
  2. ------- ----- --- ------- ------ ----
  3.  
  4. Legal Notice
  5. ----- ------
  6.  
  7. All material in this document, and the attached source code, is copyright
  8. Parallax Software, 1995.  It is released solely for the purpose of enabling
  9. legitimate owners of the registered version of Descent to create levels and
  10. missions to be used with Descent.  The release of this information should
  11. in no way be construed as implying that copyrights, patents, trademarks or
  12. trade secrets of Descent, owned by Parallax or Interplay, are weakened or
  13. invalidated.
  14.  
  15.  
  16. Description
  17. -----------
  18.  
  19. This document describes the level and mission format for the registered
  20. version of Descent.  It is hoped that this information will help people
  21. create their own levels and missions for use with Descent.  This document
  22. is not complete without the attached source code.
  23.  
  24.  
  25. Notes About Version 0.10
  26. ----- ----- ------- ----
  27.  
  28. This document, as you might guess from the version number, is not
  29. considered complete.  It is released under the assumption that it's
  30. marginally better than nothing.
  31.  
  32. It will still be difficult for anyone to create an editor to create
  33. Descent levels.  It will be very difficult to create levels that contain
  34. all the features of a complete Descent level, such as keyed doors, locked
  35. doors, a control center which triggers doors, robots containing objects,
  36. materialization centers, etc.  However, it will be a lot easier with this
  37. document than without it.
  38.  
  39. This document, and the attached source code, should be enough to enable
  40. people to create anarchy levels and missions without unbearable difficulty.
  41. There is much information about objects which is not explained.  This will
  42. be released in a future update.  If you're real curious now, a good way to
  43. figure out this information is to disassemble an existing "rdl" file.
  44.  
  45. Improved versions of this document will be posted here on an irregular
  46. basis.  I hope a significantly better version will be posted within a
  47. couple weeks.
  48.  
  49. If you find errors in this document, and you will probably find many if
  50. you try to use it, please post them in alt.games.descent.  Put some
  51. identifying information in the Subject, such as "Level Info Error: Hog
  52. File Format Bogus" or whatever.
  53.  
  54. Please read the section "About the Included Source Code".  This document
  55. should not be considered anywhere near complete without constant reference
  56. to the source code, particularly the header files.
  57.  
  58. Good luck!  All of us at Parallax are looking forward to seeing new levels!
  59.  
  60. -- Mike Kulas, March 17, 1995
  61.  
  62.  
  63. Plea for Peace
  64. ---- --- -----
  65.  
  66. Please do not contact Parallax or Interplay with questions regarding
  67. information in this document.  We do not have the resources to answer
  68. questions pertaining to level design.  We have several people who read
  69. alt.games.descent and comp.sys.ibm.pc.games.action every day.  If you
  70. have questions, please post in these newsgroups and we will answer them
  71. as best we can.
  72.  
  73.  
  74. About the Included Source Code
  75. ----- --- -------- ------ ----
  76.  
  77. The source code included with this document is provided as a document
  78. of the level format.  Although it started as actual source code from
  79. Descent, it is no longer compilable, and much has been removed from
  80. the provided functions, including some comments.  However, the portions
  81. which pertain to loading level data are most likely accurate and
  82. complete.  In cases in which this document contradicts the source code,
  83. the source code should be considered complete.
  84.  
  85. The header files contain data structure definitions.  Some of them
  86. describe the internal representation of a level, which is very different
  87. from the format stored in an "rdl" file.  They are provided as a reference
  88. to help understand the source code which reads an "rdl" file.
  89.  
  90.  
  91. Overview of Level-Related Files
  92. -------- -- ------------- -----
  93.  
  94. A Descent level is wholly contained in one file.  These files have the
  95. extension "rdl" for Registered Descent Level.
  96.  
  97. The "rdl" files which are part of Regsitered Descent are all included in
  98. the file "descent.hog".  There are, by default, no "rdl" files present
  99. in the Descent directory.  However, if there _were_ an "rdl" file, and
  100. it were specified in the "msn" file, it would get loaded, taking precedence
  101. over the version of the level in the "hog" file.  So, if you wanted to
  102. create a new level 1, you would name it "level01.rdl" and place it in the
  103. Descent directory.  It would get loaded in favor of the level01.rdl in the
  104. hog file.
  105.  
  106.  
  107. Format of RDL File
  108. ------ -- --- ----
  109.  
  110. [Before proceeding with writing an editor, I would strongly encourage
  111.  anyone to write a level ("rdl" file) disassembler.  That should
  112.  demonstrate whether the information in this document is correct, in
  113.  addition to providing necessary expertise.  Before disassembling level
  114.  files, you will need to disassemble the "hog" file.  That will be the
  115.  easiest part.  See the section "Format of the Hog File".]
  116.  
  117. The function load_level(), which is included in the partial source code,
  118. reads a level file from disk.
  119.  
  120. load_level calls load_mine_data_compiled and load_game_data.
  121. load_mine_data_compiled loads mine (level structure) data.  load_game_data
  122. loads other things which are part of a mine, such as objects (robots,
  123. powerups, etc.), initial player position information, etc.
  124.  
  125. Beginning at location 0 in the RDL file:
  126. int    sig            // signature bytes == 'PLVL' (in order 'L' 'V' 'L' 'P')
  127. int    version            // set this to 1
  128. int    minedata_offset        // offset in file of start of mine data
  129. int    gamedata_offset        // offset in file of start of game data
  130. int    unused            // unused
  131.  
  132. From location minedata_offset:
  133. byte    version            always = 0
  134. short    Num_vertices        number of vertices in this mine
  135. short    Num_segments        number of segments in this mine
  136.  
  137. Num_vertices vertex structs.
  138.  
  139.   A vertex struct is defined as three fixed point numbers.  A fix
  140.   is 32 bits.  The low 16 bits is fractional, the high 16 bits is
  141.   the integer.
  142. [The 16:16 part is irrelevant, I think.]
  143.  
  144. Num_segments segment structs.
  145.  
  146.   A segment is a variable size structure.  To understand the format, it
  147.   is necessary to read the source code included with this document.
  148.   The function load_mine_data_compiled_new reads a variable sized segment
  149.   from the "rdl" file and stores it in the internal segment struct.
  150.   The internal segment struct is described in another section below.
  151.  
  152.  
  153. From location gamedata_offset:
  154. short    signature        // bytes 05h, 67h
  155. short    version            // 0019h (we're at version 25 for release...)
  156. int    game_fileinfo_size    // 0077h
  157. char    mine_filename[15];    // for example, "Lunar Outpost"
  158. int     level;
  159. int     player_offset;
  160. int     player_sizeof;
  161. int     object_offset;
  162. int     object_howmany;       
  163. int     object_sizeof;  
  164. int     walls_offset;
  165. int     walls_howmany;
  166. int     walls_sizeof;
  167. int     doors_offset;
  168. int     doors_howmany;
  169. int     doors_sizeof;
  170. int     triggers_offset;
  171. int     triggers_howmany;
  172. int     triggers_sizeof;
  173. int     links_offset;
  174. int     links_howmany;
  175. int     links_sizeof;
  176. int     control_offset;
  177. int     control_howmany;
  178. int     control_sizeof;
  179. int     matcen_offset;
  180. int     matcen_howmany;
  181. int     matcen_sizeof;
  182.  
  183. short    Num_pofs        number of Polygon Object Files
  184. char    Pof_names[Num_pofs][13]    name of each pof file
  185.     
  186. From object_offset (read above):
  187. object    Objects[object_howmany]    static object info for each object.  See object struct.
  188.  
  189. From walls_offset (read above):
  190. wall    Walls[walls_howmany]    static wall info.  See wall struct.
  191.  
  192. From doors_offset (read above):
  193. active_door ActiveDoors[doors_howmany]    See active_door struct.
  194.  
  195. From triggers_offset (read above):
  196. trigger    Triggers[triggers_howmany]
  197.  
  198. From control_offset (read above):
  199. control_center_trigger    Control_center_triggers[control_howmany]
  200.  
  201. From matcen_offset (read above):
  202. matcen_info    RobotCenters[matcen_howmany]
  203.  
  204.  
  205. Internal Segment Struct
  206. -------- ------- ------
  207.  
  208. typedef long fix;
  209.  
  210. typedef struct vms_vector {
  211.    fix x, y, z;
  212. } vms_vector;
  213.  
  214. typedef struct uvl {
  215.    fix u,v,l;
  216. } uvl;
  217.  
  218. typedef struct side {
  219.    byte   type;                // tri_edge: 1 = quad, 2 = 0:2 triangulation, 3 = 1:3 triangulation
  220.    ubyte  pad;                 // keep us longword alligned
  221.    short  wall_num;            // Index into Walls array, which wall (probably door) is on this side
  222.    short  tmap_num;            // Index into array of textures specified in bitmaps.bin
  223.    short  tmap_num2;           // Index, as above, texture which gets overlaid on tmap_num
  224.    uvl    uvls[4];             // uvl coordinates at each point
  225.    vms_vector   normals[2];    // 2 normals, if quadrilateral, both the same.
  226. } side;
  227.  
  228. typedef struct segment {
  229.    side    sides[6];          // 6 sides
  230.    short   children[6];       // indices of 6 children segments, front, left, top, right, bottom, back
  231.    short   verts[8];          // vertex ids of 4 front and 4 back vertices
  232.    short   objects;           // index of objects in this segment
  233.    ubyte   special;           // special property of a segment (such as damaging, trigger, etc.)
  234.    byte    matcen_num;        // which center segment is associated with, high bit set
  235.    short   value;             // matcens: bitmask of producable robots, fuelcenters: energy given? --MK, 3/15/95
  236.    fix     static_light;      // average static light in segment
  237.    short   pad;               // make structure longword aligned [Too bad we didn't put this before static_light...MK, 3/15/95]
  238. } segment;
  239.  
  240.  
  241.  
  242. Format of Mission Files
  243. ------ -- ------- -----
  244.  
  245. Levels are organized into missions which are specified in a "msn" file.
  246. (The default mission, "Descent: First Strike" is built into the executable
  247. and does not have a corresponding mission file.)  The file "chaos.msn"
  248. defines the five level anarchy mission which is part of the registered
  249. version.  Here is the complete text of the file "chaos.msn":
  250.  
  251. name = Total Chaos    ;any name you want
  252. type = anarchy        ;can be "normal" or "anarchy".  Omitted means normal
  253. num_levels = 5        ;number of normal levels
  254. chaos1.rdl            ;level filename 1
  255. chaos2.rdl            ;level filename 2
  256. chaos3.rdl            ;level filename 3
  257. chaos4.rdl            ;level filename 4
  258. chaos5.rdl            ;level filename 5
  259.  
  260. It should be pretty self-explanatory.  All the "rdl" files are present in
  261. the file "chaos.hog".
  262.  
  263. Here's a more interesting mission.  Note that it contains a secret level
  264. named "levels1.rdl" which is attached to level 10.
  265.  
  266. name = Destination Saturn    ;any name you want
  267. type = normal                ;can be "normal" or "anarchy".  Omitted = normal
  268. num_levels = 15              ;number of normal levels
  269. level01.rdl                  ;level filename 1
  270. level02.rdl                  ;level filename 2
  271. level03.rdl                  ;level filename 3
  272. level04.rdl                  ;level filename 4
  273. level05.rdl                  ;level filename 5
  274. level06.rdl                  ;level filename 6
  275. level07.rdl                  ;level filename 7
  276. level08.rdl                  ;level filename 8
  277. level09.rdl                  ;level filename 9
  278. level10.rdl                  ;level filename 10
  279. level11.rdl                  ;level filename 11
  280. level12.rdl                  ;level filename 12
  281. level13.rdl                  ;level filename 13
  282. level14.rdl                  ;level filename 14
  283. saturn15.rdl                 ;level filename 15
  284. num_secrets = 1              ;number of secret levels
  285. levels1.rdl,10               ;get to first secret level from level 10
  286.  
  287.  
  288. Format of the Hog File
  289. ------ -- --- --- ----
  290.  
  291. A hog file has the following format:
  292.  
  293.   <header>   The constant bytes: 44h, 48h, 46h
  294.  
  295. Following the header are zero or more files in the following format:
  296.  
  297.   <name>     13 bytes, terminated by 0, padded, if necessary, to 13 bytes
  298.   <size>     4 byte size
  299.   <data>     <size> bytes of data comprising the file
  300.  
  301.   <name>     next file in the hog file
  302.   etc.
  303.